package dao;

/**
 * Responsavel por realizar transações com o BD
 *
 */
import classes.Categoria;
import classes.Produto;
import classes.Unidade;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DaoProduto implements IDaoProduto {

    private GerenciadorConexao g;

    public DaoProduto() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * Insere um novo registro no BD
     * @param prod
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public void inserir(Produto prod) throws ConexaoException, DaoException {
        String sql = "INSERT INTO produto (descproduto, estproduto, codcategoria, codunidade) VALUES (?,?,?,?)";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, prod.getDescProduto());
            pstm.setInt(2, prod.getEstProduto());
            pstm.setInt(3, prod.getCodCategoria().getCodCategoria());
            pstm.setInt(4, prod.getCodUnidade().getCodUnidade());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Altera um registro no BD
     * @param prod
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public void alterar(Produto prod) throws ConexaoException, DaoException {

        String sql = "UPDATE produto SET descproduto=?, estproduto=?, codcategoria=?, codunidade=?"
                + " WHERE codproduto=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, prod.getDescProduto());
            pstm.setInt(2, prod.getEstProduto());
            pstm.setInt(3, prod.getCodCategoria().getCodCategoria());
            pstm.setInt(4, prod.getCodUnidade().getCodUnidade());
            
            pstm.setInt(5, prod.getCodProduto());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Exclui um registro no BD
     * @param prod
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public void deletar(Produto prod) throws ConexaoException, DaoException {

        String sql = "DELETE FROM produto where codproduto=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setInt(1, prod.getCodProduto());

            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }

    /**
     * Faz perquisa no BD
     * @param prod
     * @return
     * @throws ConexaoException
     * @throws DaoException 
     */
    @Override
    public Produto pesquisar(Produto prod) throws ConexaoException, DaoException {
    
        String sql = "select *from produto as p, categoria as c, unidade as u "
                + "where p.codcategoria=c.codcategoria and p.codunidade=u.codunidade and p.descproduto=?";
        try {
            Unidade uni = new Unidade();
            Categoria cat = new Categoria();
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, prod.getDescProduto());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                prod.setCodProduto(rs.getInt("codproduto"));
                prod.setDescProduto(rs.getString("descproduto"));
                prod.setEstProduto(rs.getInt("estproduto"));
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
                prod.setCodCategoria(cat);
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
                prod.setCodUnidade(uni);
            }
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
        return prod;
    }
    /**
     * Faz perquisa no BD
     * @param prod
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
     public List<Produto> pesquisarProd(Produto prod) throws ConexaoException, ConsultaException {
        List<Produto> lista = new ArrayList<Produto>();
        Unidade uni;
        Categoria cat;
       String sql = "select *from produto as p, categoria as c, unidade as u "
                + "where p.codcategoria=c.codcategoria and p.codunidade=u.codunidade and p.descproduto like ?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, prod.getDescProduto());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                prod = new Produto();
                cat = new Categoria();
                uni = new Unidade();
                prod.setCodProduto(rs.getInt("codproduto"));
                prod.setDescProduto(rs.getString("descproduto"));
                prod.setEstProduto(rs.getInt("estproduto"));
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
                prod.setCodCategoria(cat);
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
                prod.setCodUnidade(uni);
                lista.add(prod);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
    
    /**
     * Lista os dados de produto /  categoria e unidade referente a produto
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
      
    public List<Produto> listar() throws ConexaoException, ConsultaException {
        List<Produto> lista = new ArrayList<Produto>();
        Unidade uni;
        Categoria cat;
        Produto prod;
        String sql = "select *from produto as p, categoria as c, unidade as u "
                + "where p.codcategoria=c.codcategoria and p.codunidade=u.codunidade order by codproduto";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while (rs.next()) {
                prod = new Produto();
                cat = new Categoria();
                uni = new Unidade();
                prod.setCodProduto(rs.getInt("codproduto"));
                prod.setDescProduto(rs.getString("descproduto"));
                prod.setEstProduto(rs.getInt("estproduto"));
                cat.setCodCategoria(rs.getInt("codcategoria"));
                cat.setNomeCategoria(rs.getString("nomecategoria"));
                prod.setCodCategoria(cat);
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
                prod.setCodUnidade(uni);
                lista.add(prod);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
}
